package com.atrium.master.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import com.atrium.master.dao.GestorUsuariosDao;
import com.atrium.master.modelo.Usuario;

public class GestorUsuariosDaoImpl extends JdbcDaoSupport implements
		GestorUsuariosDao {

	public Usuario agregarUsuario(final Usuario usuario) {
		final String INSERT_SQL = "INSERT INTO usuarios (dni,nombre,apellidos,direccion,telefono) values(?,?,?,?,?)";
		KeyHolder keyHolder = new GeneratedKeyHolder();
		getJdbcTemplate().update(new PreparedStatementCreator() {
			public PreparedStatement createPreparedStatement(
					Connection connection) throws SQLException {
				PreparedStatement ps = connection.prepareStatement(INSERT_SQL,
						new String[] { "id" });
				ps.setString(1, usuario.getDni());
				ps.setString(2, usuario.getNombre());
				ps.setString(3, usuario.getApellidos());
				ps.setString(4, usuario.getDireccion());
				ps.setInt(5, usuario.getTelefono());
				return ps;
			}
		}, keyHolder);
		usuario.setId(keyHolder.getKey().intValue());
		return usuario;
	}

	public Usuario modificarDatosUsuario(final Usuario usuario) {
		final String UPDATE_SQL = "update usuarios set nombre=?,apellidos=?,direccion=?,telefono=? where dni=?";
		KeyHolder keyHolder = new GeneratedKeyHolder();
		getJdbcTemplate().update(new PreparedStatementCreator() {
			public PreparedStatement createPreparedStatement(
					Connection connection) throws SQLException {
				PreparedStatement ps = connection.prepareStatement(UPDATE_SQL,
						new String[] { "id" });
				ps.setString(1, usuario.getNombre());
				ps.setString(2, usuario.getApellidos());
				ps.setString(3, usuario.getDireccion());
				ps.setInt(4, usuario.getTelefono());
				ps.setString(5, usuario.getDni());
				return ps;
			}
		}, keyHolder);
		return usuario;
	}
	
	public List<Usuario> obtenerListadoUsuarios() {
		final String SELECT_SQL = "select * from usuarios";
		final List<Usuario> listado = new LinkedList<Usuario>();
		getJdbcTemplate().query(SELECT_SQL, new RowCallbackHandler() {
			public void processRow(ResultSet rs) throws SQLException {
				Usuario usuario = new Usuario(
						rs.getInt("id"), rs.getString("dni"), 
						rs.getString("nombre"), rs.getString("apellidos"), 
						rs.getString("direccion"),rs.getInt("telefono"));
				listado.add(usuario);
			}
		});
		return listado;
	}
	
	public Usuario obtenerUsuarioPorId(Integer id) {
		final String SELECT_SQL = "select * from usuarios where id=?";
		return getJdbcTemplate().queryForObject(SELECT_SQL,
				new RowMapper<Usuario>() {
					public Usuario mapRow(ResultSet rs, int rowNum)	throws SQLException {
						return new Usuario(
							rs.getInt("id"), rs.getString("dni"), 
							rs.getString("nombre"), rs.getString("apellidos"), 
							rs.getString("direccion"),rs.getInt("telefono"));
					}
				}, new Object[] { id });
	}
	
	public Usuario obtenerUsuarioPorDNI(String dni) {
		final String SELECT_SQL = "select * from usuarios where dni=?";
		return getJdbcTemplate().queryForObject(SELECT_SQL,
				new RowMapper<Usuario>() {
					public Usuario mapRow(ResultSet rs, int rowNum)	throws SQLException {
						return new Usuario(
							rs.getInt("id"), rs.getString("dni"), 
							rs.getString("nombre"), rs.getString("apellidos"), 
							rs.getString("direccion"),rs.getInt("telefono"));
					}
				}, new Object[] { dni });
	}
	
	public Integer borrarUsuario(Integer id) {
		final String DELETE_SQL = "delete from usuarios where id=?";
		return getJdbcTemplate().update(DELETE_SQL, new Object[] { id });
	}
}
